热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

都会|小节_掌握了Tomcat的架构设计,Tomcat就很容易了

篇首语:本文由编程笔记#小编为大家整理,主要介绍了掌握了Tomcat的架构设计,Tomcat就很容易了相关的知识,希望对你有一定的参考价值。

篇首语:本文由编程笔记#小编为大家整理,主要介绍了掌握了Tomcat的架构设计,Tomcat就很容易了相关的知识,希望对你有一定的参考价值。



Tomcat的架构设计

1.Servlet规范


1.1 Servlet作用讲解

  Servlet是JavaEE规范中的一种,主要是为了扩展Java作为Web服务的功能,统一定义了对应的接口,比如Servlet接口,HttpRequest接口,HttpResponse接口,Filter接口。然后由具体的服务厂商来实现这些接口功能,比如Tomcat,jetty等。

 &ems;在规范里面并不会有具体的实现。可以自行看下源码,而在Servlet规范中规定了一个http请求到来的执行处理流程:对应的服务器容器会接收到对应的Http请求,然后解析该请求,然后创建对应的Servlet实例,调用对应init方法来完成初始化,把请求的相关信息封装为HttpServletRequest对象来调用Servlet的service方法来处理请求,然后通过HttpServletResponse封装响应的信息交给容器,响应给客户端。


1.2 Servlet核心API

  我们再来回顾下Servlet中的核心API,这块对我们更好的掌握Tomcat的内容还是非常有帮助的。


API描述
ServletConfig获取servlet初始化参数和servletContext对象。
ServletContext在整个Web应用的动态资源之间共享数据。
ServletRequest封装Http请求信息,在请求时创建。
ServletResponse封装Http响应信息,在请求时创建。

ServletConfig:

  容器在初始化servlet时,为该servlet创建一个servletConfig对象,并将这个对象通过init()方法来传递并保存在此Servlet对象中。核心作用:


  1. 获取初始化信息;
  2. 获取ServletContext对象。

ServletContext

  一个项目只有一个ServletContext对象,可以在多个Servlet中来获取这个对象,使用它可以给多个Servlet传递数据,该对象在Tomcat启动时就创建,在Tomcat关闭时才会销毁!作用是在整个Web应用的动态资源之间共享数据。

  在实际的Servlet开发中,我们会实现HttpServlet接口,在该接口中会实现GenericServlet,而在GenericServlet会实现ServiceConfig接口,从而可以获取ServletContext容器对象

所以在Servlet中我们可以很容易的获取到ServletContext对象,从而完成对应的操作。

public class ServletTwoImpl extends HttpServlet
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
response.setContentType("text/html;charset=utf-8");
// 1、参数传递
ServletContext servletContext = this.getServletContext() ;
String value = String.valueOf(servletContext.getAttribute("name")) ;
System.out.println("value="+value);
// 2、获取初始化参数
String userName= servletContext.getInitParameter("user-name") ;
System.out.println("userName="+userName);
// 3、获取应用信息
String servletContextName = servletContext.getServletContextName() ;
System.out.println("servletContextName="+servletContextName);
// 4、获取路径
String pathOne = servletContext.getRealPath("/") ;
String pathTwo = servletContext.getRealPath("/WEB-INF/") ;
System.out.println("pathOne="+pathOne+";pathTwo="+pathTwo);
response.getWriter().print("执行:doGet; value:"+value);



1.3 ServletRequest

  HttpServletRequest接口继承ServletRequest接口,用于封装请求信息,该对象在用户每次请求servlet时创建并传入servlet的service()方法,在该方法中,传入的servletRequest将会被强制转化为HttpservletRequest 对象来进行HTTP请求信息的处理。核心作用:


  1. 获取请求报文信息;

  2. 获取网络连接信息;

  3. 获取请求域属性信息。


1.4 ServletResponse

  HttpServletResponse继承自ServletResponse,封装了Http响应信息。客户端每个请求,服务器都会创建一个response对象,并传入给Servlet.service()方法。核心作用:


  1. 设置响应头信息;

  2. 发送状态码;

  3. 设置响应正文;

  4. 重定向;


2.Tomcat的设计

  通过上面Servlet规范的介绍,其实我们发下我们要实现Servlet规范的话,很重要的就得提供一个服务容器来获取请求,解析封装数据,并调用Servlet实例相关的方法。也就是如下图中的部分

  这块的内容其实就是Tomcat,具体的我们来看看。


2.1 什么是Tomcat

  Tomcat是一个容器,用于承载Servlet,那么我们说Tomcat就是一个实现了部分J2EE规范的服务器。J2 EE和Jakarta EE(Eclipse基金会)这两是啥?用于Tomcat10以后都是Jakarta EE,而9之前就是J2EE.


2.2 Tomcat的架构结构

  我们通过上面的分析,知道Tomcat是一个Servlet规范的实现,要接收请求和响应请求,那么具体是如何实现的呢?这块我们可以通过conf下的server.xml得出对应的结论。

  server.xml是Tomcat中最重要的配置文件,server.xml 的每一个元素都对应了Tomcat 中的一个组件 ;通过对xml文件中元素的配置,可以实现对Tomcat中各个组件的控制。因此,学习server.xml文件的配置,对于了解和使用Tomcat至关重要.

官方文档:https://tomcat.apache.org/tomcat-8.5-doc/config/server.html


<Server port&#61;"8005" shutdown&#61;"SHUTDOWN">
<Service name&#61;"Catalina">
<Executor name&#61;"tomcatThreadPool" namePrefix&#61;"catalina-exec-"
maxThreads&#61;"150" minSpareThreads&#61;"4"/>

<Connector port&#61;"8080" protocol&#61;"HTTP/1.1"
connectionTimeout&#61;"20000"
redirectPort&#61;"8443" />


<Connector executor&#61;"tomcatThreadPool"
port&#61;"8080" protocol&#61;"HTTP/1.1"
connectionTimeout&#61;"20000"
redirectPort&#61;"8443" />

<Engine name&#61;"Catalina" defaultHost&#61;"localhost">
<Realm className&#61;"org.apache.catalina.realm.LockOutRealm">

<Realm className&#61;"org.apache.catalina.realm.UserDatabaseRealm"
resourceName&#61;"UserDatabase"/>

Realm>
<Host name&#61;"localhost" appBase&#61;"webapps"
unpackWARs&#61;"true" autoDeploy&#61;"true">

<Valve className&#61;"org.apache.catalina.valves.AccessLogValve" directory&#61;"logs"
prefix&#61;"localhost_access_log" suffix&#61;".txt"
pattern&#61;"%h %l %u %t "%r" %s %b" />

Host>
Engine>
Service>
Server>

极简模式

<Server>
<Service>
<Connector />
<Connector />
<Engine>
<Host>
<Context />
Host>
Engine>
Service>
Server>

梳理出的结构

对应的每个组件的作用。


2.3 组件分类

  官网其实对上面的组件也做了分类:

顶级元素:


  • Server&#xff1a;是整个配置文件的根元素

  • Service:代表一个Engine元素以及一组与之相连的Connector元素

连接器&#xff1a;


  • 代表了外部客户端发送请求到特定Service的接口&#xff1b;同时也是外部客户端从特定Service接收响应的接口。

容器&#xff1a;

  容器的作用是处理Connector接收进来的请求&#xff0c;并产生对应的响应&#xff0c;Engine&#xff0c;Host和Context都是容器&#xff0c;他们不是平行关系&#xff0c;而是父子关系。

每个组件的作用&#xff1a;


  • Engine:可以处理所有请求
  • Host:可以处理发向一个特定虚拟主机的所有请求
  • Context:可以处理一个特定Web应用的所有请求

核心组件的串联关系&#xff1a;

  当客户端请求发送过来后其实是通过这些组件相互之间配合完成了对应的操作。


  • Server元素在最顶层&#xff0c;代表整个Tomcat容器&#xff1b;一个Server元素中可以有一个或多个Service元素
  • Service在Connector和Engine外面包了一层&#xff0c;把它们组装在一起&#xff0c;对外提供服务。一个Service可以包含多个Connector&#xff0c;但是只能包含一个Engine&#xff1b;Connector接收请求&#xff0c;Engine处理请求。
  • Engine、Host和Context都是容器&#xff0c;且Engine包含Host&#xff0c;Host包含Context。每个Host组件代表Engine中的一个虚拟主机&#xff1b;每个Context组件代表在特定Host上运行的一个Web应用.

整体Tomcat的运行架构图


推荐阅读
  • 开发笔记:Java是如何读取和写入浏览器Cookies的
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Java是如何读取和写入浏览器Cookies的相关的知识,希望对你有一定的参考价值。首先我 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了使用postman进行接口测试的方法,以测试用户管理模块为例。首先需要下载并安装postman,然后创建基本的请求并填写用户名密码进行登录测试。接下来可以进行用户查询和新增的测试。在新增时,可以进行异常测试,包括用户名超长和输入特殊字符的情况。通过测试发现后台没有对参数长度和特殊字符进行检查和过滤。 ... [详细]
  • JavaScript设计模式之策略模式(Strategy Pattern)的优势及应用
    本文介绍了JavaScript设计模式之策略模式(Strategy Pattern)的定义和优势,策略模式可以避免代码中的多重判断条件,体现了开放-封闭原则。同时,策略模式的应用可以使系统的算法重复利用,避免复制粘贴。然而,策略模式也会增加策略类的数量,违反最少知识原则,需要了解各种策略类才能更好地应用于业务中。本文还以员工年终奖的计算为例,说明了策略模式的应用场景和实现方式。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 【MEGA DEAL】Ruby on Rails编码训练营(97%折扣)限时特惠!
    本文介绍了JCG Deals商店提供的Ruby on Rails编码训练营的超值优惠活动,现在只需29美元即可获得,原价为$1,296。Ruby on Rails是一种用于Web开发的编程语言,即使没有编程或网页设计经验,也能在几分钟内构建专业的网站。该训练营共有6门课程,包括使用Ruby on Rails进行BDD的课程,使用RSpec 3和Capybara等。限时特惠,机会难得,赶快行动吧! ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • 本文介绍了Java的集合及其实现类,包括数据结构、抽象类和具体实现类的关系,详细介绍了List接口及其实现类ArrayList的基本操作和特点。文章通过提供相关参考文档和链接,帮助读者更好地理解和使用Java的集合类。 ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • Final关键字的含义及用法详解
    本文详细介绍了Java中final关键字的含义和用法。final关键字可以修饰非抽象类、非抽象类成员方法和变量。final类不能被继承,final类中的方法默认是final的。final方法不能被子类的方法覆盖,但可以被继承。final成员变量表示常量,只能被赋值一次,赋值后值不再改变。文章还讨论了final类和final方法的应用场景,以及使用final方法的两个原因:锁定方法防止修改和提高执行效率。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • springmvc学习笔记(十):控制器业务方法中通过注解实现封装Javabean接收表单提交的数据
    本文介绍了在springmvc学习笔记系列的第十篇中,控制器的业务方法中如何通过注解实现封装Javabean来接收表单提交的数据。同时还讨论了当有多个注册表单且字段完全相同时,如何将其交给同一个控制器处理。 ... [详细]
author-avatar
一片绿洲053766
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有